package config

import (
	"encoding/json"
	"fmt"
	"log"
	"os"
)

type configs struct {
	Port     int  `json:"port"`
	Debug    bool `json:"debug"`
	Database struct {
		DriverName string `json:"driver_name"`
		Host       string `json:"host"`
		Port       int    `json:"port"`
		Database   string `json:"database"`
		Username   string `json:"username"`
		Password   string `json:"password"`
		Charset    string `json:"charset"`
	} `json:"database"`
	LLM struct {
		APIKey  string `json:"api_key"`
		BaseURL string `json:"base_url"`
		Model   string `json:"model"`
	} `json:"llm"`
	SMTP struct {
		Server   string `json:"server"`
		Port     string `json:"port"`
		Username string `json:"username"`
		Password string `json:"password"`
	} `json:"smtp"`
	CodeStorePath string `json:"code_store_path"`
	Redis         struct {
		Host     string `json:"host"`
		Port     int    `json:"port"`
		Password string `json:"password"`
		DB       int    `json:"db"`
	} `json:"redis"`
}

var Configs configs

func init() {
	// 读取配置文件
	configPath := "./conf.json"
	data, err := os.ReadFile(configPath)
	if err != nil {
		// 尝试回退到当前工作目录
		data, err = os.ReadFile("conf.json")
		if err != nil {
			log.Fatal("无法读取配置文件:", err)
		}
	}

	// 解析 JSON
	if err := json.Unmarshal(data, &Configs); err != nil {
		log.Fatal("配置文件解析失败:", err)
	}

	err = validate()
	if err != nil {
		return
	}
}

// 配置验证
func validate() error {
	// 端口范围
	if Configs.Port < 1 || Configs.Port > 65535 {
		return fmt.Errorf("无效端口号: %d", Configs.Port)
	}

	// 数据库必要字段
	db := Configs.Database
	if db.DriverName == "" || db.Host == "" || db.Username == "" {
		return fmt.Errorf("缺失必要数据库配置")
	}

	// 字符集白名单
	allowedCharsets := map[string]bool{
		"utf8": true, "utf8mb4": true, "latin1": true}
	if !allowedCharsets[db.Charset] {
		return fmt.Errorf("不支持的字符集: %s", db.Charset)
	}

	// SMTP 必要字段
	smtp := Configs.SMTP
	if smtp.Server == "" || smtp.Port == "" || smtp.Username == "" || smtp.Password == "" {
		return fmt.Errorf("缺失必要 SMTP 配置")
	}

	if Configs.Redis.Host == "" {
		return fmt.Errorf("缺失 Redis 主机配置")
	}

	return nil
}
